﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;
using Atendex.Dominio;
using Atendex.Dominio.Interfaces;
using Atendex.Web.AppCode;
using Atendex.Infraestrutura.Repositórios;
using Atendex.Containex;
using System.Collections.Generic;

public partial class MasterPage : System.Web.UI.MasterPage
{
    private RepositorioUsuario repositorio = new RepositorioUsuario();


    protected void Page_Load(object sender, EventArgs e)
    {
        this.lblMensagem.Visible = false;
        this.Page.Title = "Atendex System 1.0 - Computex Ltda.";
        if (!this.IsPostBack)
        {
            IUsuario usuario = AtendexContext.UsuarioAtual(this.Page);
            LogaUsuario(usuario);
        }
    }

    protected void btnLogin_Click(object source, EventArgs e)
    {
        IUsuario usuario = repositorio.ObtemPorLoginESenha(txtLogin.Text, txtSenha.Text);


        if (usuario == null)
        {
            ShowMensagem("Login ou Senha incorretos.");
        }
        else
        {
            LogaUsuario(usuario);
            AtendexContext.SetAtendenteAtual(this.Page, usuario);
        }
    }

    protected void btnLogout_Click(object source, EventArgs e)
    {
        AtendexContext.Logout(this.Page);
        LogaUsuario(null);
    }

    private void ShowMensagem(string mensagem)
    {
        this.lblMensagem.Text = mensagem;
        this.lblMensagem.Visible = true;
    }

    private void LogaUsuario(IUsuario usuario)
    {
        if (usuario == null)
        {
            this.pnlLogin.Visible = true;
            this.pnlLogado.Visible = false;
        }
        else
        {
            this.pnlLogin.Visible = false;
            this.pnlLogado.Visible = true;
            this.lblNomeUsuario.Text = usuario.Nome;
        }
        ExibeMenus(this.Controls, usuario);
    }


    private void ExibeMenus(ControlCollection controles, IUsuario usuario)
    {
        var controles2 = from controle in controles.All()
                         where controle is WebControl
                               && !string.IsNullOrEmpty(((WebControl) controle).Attributes["Role"])
                         select new {Controle = controle, Role = ((WebControl) controle).Attributes["Role"]};

        controles2.ForEach(c => c.Controle.Visible = (usuario is IAtendente && c.Role == "Atendente")
                                                     || (usuario is IGerente && c.Role == "Gerente"));
        controles2.ForEach(c => ExibeMenus(c.Controle.Controls, usuario));
    }


    protected void btnPreencher_Click(object source, EventArgs e)
    {
        #region "Cadastrar Gerente"
        IGerente gerente = Container.CriaGerente("g", "g", "g", "g");
        new RepositorioGerente().Salvar(gerente);
        #endregion

        #region "Cadastrar Atendente"
        IAtendente atendente = Container.CriarAtendente("a", "a", "a", "a");
        new RepositorioAtendente().Salvar(atendente);
        #endregion

        #region "Criar Responsavel"
        IResponsavel responsavel = Container.CriarResponsavel("Bob", "bob@localhost");
        #endregion

        #region "Cadastrar Meios"
        var meioRespositorio = new RepositorioMeio();
        IMeio meioEmail = Container.CriarMeioContato("Email");
        IMeio meioTelefone = Container.CriarMeioContato("Telefone");
        meioRespositorio.Salvar(meioEmail);
        meioRespositorio.Salvar(meioTelefone);
        #endregion

        #region "Cadastrar Unidade Negocio"
        var repositorioUnidadeNegocio = new RepositorioUnidadeNegocio();
        IUnidadeNegocio areaAdministrativa = Container.CriarUnidadeNegocio("Administrativa", responsavel);
        IUnidadeNegocio areaFinanceira = Container.CriarUnidadeNegocio("Financeira", responsavel);

        repositorioUnidadeNegocio.Salvar(areaAdministrativa);
        repositorioUnidadeNegocio.Salvar(areaFinanceira);
        #endregion

        #region "Cadastrar Curso"
        var repositorioCurso = new RepositorioCurso();
        ICurso cursoAdministracao = Container.CriarCurso("Administração", new List<IResponsavel> {responsavel});
        ICurso cursoGerencia = Container.CriarCurso("Gerência", new List<IResponsavel> { responsavel });

        repositorioCurso.Salvar(cursoAdministracao);
        repositorioCurso.Salvar(cursoGerencia);
        #endregion

        #region "Cadastrar Tipo Solicitante"
        var tipoSolicitanteRepositorio = new RepositorioTipoSolicitante();
        ITipoSolicitante tipoAluno = Container.CriarTipoSolicitante("Aluno");
        ITipoSolicitante tipoProfessor = Container.CriarTipoSolicitante("Professor");
        tipoSolicitanteRepositorio.Salvar(tipoAluno);
        tipoSolicitanteRepositorio.Salvar(tipoProfessor);
        #endregion

        #region "Cadastrar TipoSolicitacao"
        var tipoSolicitacaoANRepositorio = new RepositorioTipoSolicitacaoAN();
        ITipoSolicitacaoAN tipoSolicitacaoAN =
            Container.CriarTipoSolicitacaoAN("Recibo de pagamento",
                                             "Solicitação de recibo de pagamento do curso.",
                                             areaFinanceira);
        tipoSolicitacaoANRepositorio.Salvar(tipoSolicitacaoAN);
        #endregion

        #region "Criar Solicitante"
        ISolicitante solicitante = Container.CriarSolicitante("bob", meioEmail);
        #endregion

        #region "Cadastrar Atendimento"

        var repositorioAtendimento = new RepositorioAtendimento();
        for (int i = 0; i < 30; i++)
        {
            Random r = new Random(DateTime.Now.Millisecond);
            IAtendimento atendimento = Container.CriarAtendimento(atendente);
            atendimento.DataInicio = DateTime.Now.AddDays(r.Next(-10, 10));
            atendimento.DataFim = DateTime.Now.AddDays(r.Next(0, 20));
            atendimento.Status = StatusAtendimento.Pendente;
            atendimento.Solicitante = solicitante;
            IOrdemServico os = Container.CriarOrdemServico(atendimento, tipoSolicitacaoAN, Container.CriarMensagem("bla"));

            atendimento.OrdensServico.Add(os);

            repositorioAtendimento.Salvar(atendimento);
        }
        #endregion
    }
}